Skip to content

docs: one fact spelled once, and the marker the reader can see - #454

Merged
firejune merged 1 commit into
mainfrom
docs/one-fact-one-string
Sep 7, 2026
Merged

docs: one fact spelled once, and the marker the reader can see#454
firejune merged 1 commit into
mainfrom
docs/one-fact-one-string

Conversation

@firejune

@firejune firejune commented Sep 7, 2026

Copy link
Copy Markdown
Owner

Closes #443, closes #444.

bun run typecheck clean, bun run lint clean, bun run selftest 564 PASS / 0 FAIL / 0 SKIP / 0 HOLE, exit 0 (562 on main). The +2 is exactly CUR09 and GT06.

🔒 No summary figure was edited, which is #452's promise being kept rather than asserted: TY10 reports the identical 548 literal runs, 48 clause openings, 46 value-filled, 40 n('…') calls before and after.

#443 — measured before choosing, and the measurement changed the answer

The card assumed the sed copies might be dead weight. They are not: all three run and all three reproduce their refusals, and "degrees": 12 occurs eight times in gallery/nod/motion.json, so the one-liner and the recipe are the same replace-all rather than two edits that happen to agree.

So the argument had to be settled on other grounds — and there, the two fences turn out not to be the same object, which the card's framing does not distinguish and the tree does:

  • The portrait pitch fence is a pure duplicate. One sed, one build, and the recipe two lines below states exactly that edit and that verb. Deleted whole. The prose above pointed into the fence (`/tmp/pp.json` above), so the two paragraphs around it were merged into one that names no path.
  • The nod fence is half a duplicate. It brackets the fold angle from both sides: the 34° build is the recipe spelled twice, the 33° build is the green side. ⭐ The green side is not expressible as a recipe by constructionGT05 faults a recipe whose edit leaves the build green — so the grammar structurally cannot carry it, and that line is the only copy of that fact. The 34° line is deleted, the 33° line kept, and the lead-in reworded from "Two builds:" to "The green side of the bracket:".

Rejected, on a closed question rather than on taste

Generating the sed line from the recipe. A recipe carries from, to, example, spec and verb; the sed line also carries a redirect target, an --out directory and a # green / # A39 fires comment, none of which the recipe has or could derive — a generator would have to mint them, and a minted convention is the next hand-kept thing. Decisively, #442 already refused ending a recipe in a runnable command because "that command as written does not run … it would look copy-pasteable and not be." Re-adding a copy-pasteable rendering reopens a question this repository closed.

A checker over the surviving sh fence — the forbidden third state, which gates the copy instead of removing it.

The four refusal blocks reproduce exactly as before, proved rather than asserted

GT02 4 blocks / 29 wrapped lines before and after; GT01 found 25 / byTag 14 / byHead 6 / byRecipe 4 / verified 18 / declared 7, identical; GT03 92 planted edits, 0 misses, identical; GT05 notDragged 14, 7 grammar refusals, 4 elision probes, identical. Only line numbers moved.

GT06, and the population that makes it a gate

GT06_THE_EDIT_A_REFUSAL_RECIPE_STATES_IS_SPELLED_ONCE reads every fenced block the transcript scan skips — the ones with an info string — against the recipes the gallery carries, and faults a line spelling both halves of one edit.

Its negative population is real rather than synthetic: 10 lines name a recipe's from and patch it to something else (the surviving 33° line, the amplitude and wavelength sweeps) and are all left alone. Its red-first probe is generated from the grammar, so it cannot drift away from it.

⚠️ gallery/README.md is deliberately outside that scan and the reason was measured, not assumed. The index shows one filled-in recipe inside a ```markdown fence, so it carries both halves of an edit on one line — and it is not a copy, because GT05 already requires that example to parse and to be a recipe some README really carries. Widening the scan would have faulted the one copy in the tree that is already derived. The reason is written into the case.

#444 — an HTML comment explaining an HTML comment

docs/SPEC_COVERAGE.md opened with eight lines of comment above the marker comment. Both are gone; one visible sentence stands there:

A dated record: what this page states was measured on the date it carries and is not kept current, so the selftest's currency gate leaves its figures alone.

  • One string. The sentence assembles from one constant, the pattern is generated from its lead, and the header comment names the constant rather than quoting the syntax — which is what docs(gallery): the marker that tells the gate how to check a block tells the reader too #442 did to its own header.
  • Exactly one form parses. CUR09 proves the retired comment declares nothing, and that the sentence wrapped back into a comment declares nothing either.
  • A near miss faults by name. A header line opening with the lead and then not the sentence is reported, rather than read as "this file never asked to be exempt" — the outcome that would be worse than no marker at all.
  • The date is deliberately not a field. The page carries 2026-08-22 in its own prose; interpolating it would be a second copy of exactly the kind this scan refuses. CUR01 still requires an ISO date in the header and the marker points at it.

The hand-written decoder #444 said to look for was there — the eight-line comment existed only because the marker was unreadable. Deleted.

🔒 CUR01's population did not move, figure for figure: 22 docs read (14 shipped, 8 one hop off README), 1 dated record, and every "sites read" limb unchanged. No floor was lowered — two clauses were added, and the second is a floor the marker never had: before this, a marker form that stopped matching would have taken the page silently back into the scan.

Mutants — planted in the real file, run, restored, checksummed

#444 red-first ①, the retired comment form back where the sentence is — 561 PASS / 3 FAIL / exit 1:

CUR01: not one document carries the dated-record marker and one is supposed to: either the
sentence moved in the tree and not here, or the escape hatch has stopped being taken and a
page whose figures are known to be stale is now being read as current
CUR02: 1 stale tally: docs/SPEC_COVERAGE.md:89 "31 assertions" states 31, and the assertion
registry holds 41
CUR09: no document in the tree carries the marker, so every clause above was checked against
synthetic text only

CUR02 is the proof the escape hatch was doing work: with the marker gone, the page's own stale figure is refused against the registry.

#444 red-first ②, a near miss — the message names both strings and says why a near miss is worse than a file that never asked:

CUR01: a header line opens with the dated-record marker's lead and is then not the marker:
docs/SPEC_COVERAGE.md reads "**A dated record:** measured a while ago and not since." … so a
near miss is an escape hatch an author meant to take and did not — which is worse than a file
that never asked for one

#443 red-first, the deleted sed line put back verbatim — 563 PASS / 1 FAIL / exit 1, and the count is the point: GT01GT05 stay green, so the refusal block still reproduces with the copy beside it and only the new gate sees it.

GT06: gallery/nod/README.md:866 spells a recipe's whole edit a second time, in a `sh` fence
this scan skips — the recipe is "replace `"kind": "yaw", "radius"` with `"kind": "pitch",
"radius"` in `gallery/portrait/motion.json`, then run `build`."

Negative controls: a command naming only a recipe's from; one naming neither half; the ten real gallery lines; the marker sentence itself; a marked page with an ISO date. None caught.

🚨 A check that printed the pass sentence while failing

CUR09's first version went red with the marker reverted and its detail read "…and all 0 marked document(s) carry the sentence verbatim"a FAIL whose message says everything is fine. The floor was a bare conjunct in the verdict rather than an entry in probes. Fixed here and re-run, and recorded because it is the doctrine's first bullet exactly: the message is the product.

Reported, not fixed

  • The marked set has a floor but no cap. Nothing refuses a second document taking the escape hatch; it would appear in a PASS detail and nothing would go red. The deleted comment's "Do NOT copy it…" was the only thing that ever said so, and it was a comment in one file that nobody read. How many documents may be exempt is a decision, not a measurement, so a note stands beside CUR01 instead of an invented number.
  • The nod 34° refusal is a two-line refusal quoted one line deep. The build prints A39 twice — same triangles and areas, two keys — and the README quotes only the first. GT02 permits this, so it is not a gate defect; it is a block showing half of what a reader would see. Left alone, because changing it is a content edit and two refusal recipes are also spelled as sed one-liners in sh fences, and that copy is ungated #443 forbids one.

The next drift this change makes

Asked before finishing, and three hand-kept things came back out: a comment stating "exactly one document needs it" (a count the run already prints) became "one document takes it today" with the cap gap named beside it; GT06's comment stopped naming 33° and states what is structural instead; CUR09's detail interpolates the header-line count rather than spelling it.

What could not be removed: the marker sits three paragraphs above the page's own 🔼 "this note is dated" blockquote, so a reader meets the idea twice. They are not the same claim, and making the blockquote itself the marker fails on mechanics — it is > -prefixed and wrapped over three source lines, and anything looser is a second accepted spelling.

Two sed one-liners in sh fences restated the replace-all their refusal block's
recipe already states, and sh fences are skipped by the scanner, so one copy was
checked and one was not.

Measured before choosing, because the brief assumed they might not run: they do.
Both reproduce their refusals, and "degrees": 12 occurs eight times in the nod
motion spec, so the one-liner and the recipe are the same replace-all rather than
two edits that agree.

The two fences are not the same object. The portrait pitch fence is a pure
duplicate and is deleted whole. The nod fence brackets the fold angle from both
sides, and only the 34 degree half is the recipe spelled twice: a recipe whose
edit leaves the build green is refused by GT05, so the grammar structurally
cannot carry the 33 degree side and that line is the only copy of it.

Generating the sed line from the recipe was rejected on a closed question rather
than on taste. #442 already refused ending a recipe in a runnable command because
the command as written does not run, and a rendering that looks copy-pasteable
and is not would reopen it.

GT06 keeps the deletion: every fence the transcript scan skips is read against
the recipes the gallery carries, and a line spelling both halves of one edit
faults. Ten real lines name a recipe's from and patch it elsewhere and are left
alone, which is the half the rule must not touch.

The dated-record marker was an HTML comment under eight lines of HTML comment
explaining it. Both are gone and one visible sentence stands in their place,
assembled from one constant so the sentence a reader sees is the one CUR01
parses. Exactly one form parses: CUR09 proves the retired comment declares
nothing, and that the sentence wrapped back into a comment declares nothing
either. CUR01 gained a floor it never had, so a marker form that stops matching
now faults instead of quietly taking the page back into the scan.

CUR01's population did not move, figure for figure.

Closes #443, closes #444.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@firejune
firejune enabled auto-merge (squash) September 7, 2026 04:49
@firejune
firejune merged commit d74ca74 into main Sep 7, 2026
1 check passed
@firejune
firejune deleted the docs/one-fact-one-string branch September 7, 2026 04:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant